/*
 * 版权信息：北京汉方三陆零科技有限公司</br>
 * Copyright ©2014-2015. All rights reserved.  京ICP备15000045号
 */
package com.lin.decorator.hospital;
/****************************************************************************
 * com.lin.decorator.Hospital Hospital.java Created on 2016年1月7日
 * @Author: linfenliang
 * @Description:
 * <pre>
 * 针对一个对象，可以有很多子对象
 * 不同的子对象可以有不同的行为（或动作）
 * 那么这些行为或动作可以抽离出来作为不同子对象的组合修饰者来使用
 * 同时，遵循开闭原则，对修改对象、修改动作是关闭的，对新增子对象、新增修饰者是开放的
 * 如 bird(鸟)是一个抽象的类，可以有eat()、song()、sleep() getName()方法，
 * 那么不同的鸟吃的东西、鸣叫的声音可能不一样，同时sleep是一样的，这样就可以产生多种不同的组合
 * </pre>
 * 
 * 这个例子可能有些牵强，只为说明装饰者模式
 * 
 * 不同的专科医院有不同的等级（如三家、三级特等、二级乙等）
 * 
 * 针对不同的等级或类型，会有相关不同的操作，比如
 * 是否支持医保
 * 医疗条件
 * 床位资源等
 * 特色服务（上门等）
 * 后续可能还会增加其他的等级种类，比如民营医院，私人医院
 * 
 * 
 * 医院可能会有好多，甚至包括各种诊所
 * 
 * 
 * @Version: 1.0
 ***************************************************************************/
public abstract class Hospital {
	String name = "unKnown hospital name";
	public abstract String getDescription();
	public String getName(){
		return name;
	};
}
class DongzhimenHospital extends Hospital{
	public DongzhimenHospital() {
		this.name = "东直门医院";
	}
	@Override
	public String getDescription() {
		return "   位于东直门附近，是一所含中医科、骨科的医院";
	}

}
class GuoyitangHospital extends Hospital{
public GuoyitangHospital() {
	this.name = "国医堂";
}
	@Override
	public String getDescription() {
		return "    是一所中医诊所，有中医科";
	}
	
}

abstract class LevelDecorator extends Hospital{
	public abstract String getName();
}
class PersonalHospital extends LevelDecorator{
	Hospital h;
	public PersonalHospital(Hospital hospital) {
		this.h = hospital;
	}
	@Override
	public String getName() {
		return "民营医院 "+h.getName();
	}
	@Override
	public String getDescription() {
		return h.getDescription()+"，这是一所民营医院;";
	}
	
}
class TopPublicHospital extends LevelDecorator{
	Hospital h;
	public TopPublicHospital(Hospital hospital) {
		this.h = hospital;
	}
	@Override
	public String getName() {
		return "三级特等医院 "+h.getName();
	}
	@Override
	public String getDescription() {
		return h.getDescription()+"，这是一家中国顶级医院;";
	}
}








abstract class Bird{
		String name;
		abstract void eat();
		abstract String getName();
		abstract void song();
		void sleep(){
			System.out.println("....bird....sleeping...");
		}
	}
class Chicken extends Bird{//鸡
	Chicken(){
		this.name = "Chicken";
	}
	void eat(){
//		System.out.println("---eat wheat----");
	}
	String getName(){
		return this.name;
	}
	void song(){
		System.out.println("---jijiji----");
	}
}
class Swallow extends Bird{
	public Swallow() {
		this.name = "Swallow";
	}
	@Override
	void eat() {
		System.out.println("---eat worm----");
		
	}

	@Override
	String getName() {
		return this.name;
	}

	@Override
	void song() {
		System.out.println("---yingyingyanyan----");
		
	}
	
}


class FlyBirdDecorator extends Bird{
	Bird bird;
	public FlyBirdDecorator(Bird bird) {
		this.bird = bird;
	}

	@Override
	void eat() {
		this.bird.eat();
	}

	@Override
	String getName() {
		return this.bird.getName();
	}

	@Override
	void song() {
		this.bird.song();
		System.out.println("I can fly,I can fly");
	}
	
}

class RunBirdDecorator extends Bird{
	Bird bird;
	public RunBirdDecorator(Bird bird) {
		this.bird = bird;
	}

	@Override
	void eat() {
		this.bird.eat();
	}

	@Override
	String getName() {
		return this.bird.getName();
	}

	@Override
	void song() {
		this.bird.song();
		System.out.println("song  I can run,I can run");
	}
	
}

class SuperBigBirdDecorator extends Bird{
	Bird bird;
	public SuperBigBirdDecorator(Bird bird) {
		this.bird = bird;
	}

	@Override
	void eat() {
		this.bird.eat();
		System.out.println("-----eat little bird-----");
	}

	@Override
	String getName() {
		return this.bird.getName();
	}

	@Override
	void song() {
		this.bird.song();
	}
	
}

class FamilyBirdDecorator extends Bird{
	Bird bird;
	public FamilyBirdDecorator(Bird bird) {
		this.bird = bird;
	}

	@Override
	void eat() {
		this.bird.eat();
		System.out.println("-----eat wheat---");
	}

	@Override
	String getName() {
		return this.bird.getName();
	}

	@Override
	void song() {
		this.bird.song();
	}
	
}







